package com.mf.valid.validator;

import com.mf.valid.ValidEnumValue;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

/**
 * @Author: lmf
 * @Create: 2025/5/4 13:02
 * @module
 */
public class ValidatorEnumValue implements ConstraintValidator<ValidEnumValue, Object> {
    private final Set<String> enumValues = new HashSet<>();

    @Override
    public void initialize(ValidEnumValue constraintAnnotation) {
        Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClass();
        try {
            // 获取枚举类中的 getCode 方法
            Method codeMethod = enumClass.getDeclaredMethod("getCode");
            // 允许访问私有方法
            codeMethod.setAccessible(true);

            // 获取枚举类的所有常量
            for (Enum<?> enumConstant : enumClass.getEnumConstants()) {
                Object codeValue = codeMethod.invoke(enumConstant);
                enumValues.add(codeValue.toString());
            }

        } catch (NoSuchMethodException e) {
            throw new RuntimeException("枚举中必须要有 getCode 方法");
        } catch (InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        // 对没有值的不进行验证 如果需要必须有值可以配合 @NotNull 等注解使用
        if (value == "" || value == null) {
            return true;
        }
        return enumValues.contains(value.toString());
    }
}
